#include "par_tab.h"
#include "par_user.h"
#include "gui\gui_main.h"

extern timer_pulse_type key_pulse;

#define tim_pulse key_pulse
#define pos_shift gui_st.edit_shift
#define par_key gui_st.key

/*******************************************************************************
* @brief   VAR.
*******************************************************************************/
par_manager_type par_set;
static const int32_t inc_num[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};
static const int32_t inc_tim[10] = {1, 10, 60, 600, 6000, 60000, 600000, 6000000};

/*******************************************************************************
* @brief   FUN.
*******************************************************************************/

/*******************************************************************************
* @brief   unlock entry.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_lck_entry(void)
{
	par_jump_init(&par_set, &sys_par.head, par_attr_tab, par_pos(end));
	par_jump_start(&par_set, par_pos(unlock_code));
	par_set.par_val.ival = par_set.par_val_old.ival = par_attr_tab[par_pos(unlock_code)].init;
	par_set.st_set = SET_ST_LCK;
}

/*******************************************************************************
* @brief   quit.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_opt_quit(void)
{
	if (par_set.st_val_changed)
	{
		if (par_set.st_set == SET_ST_SYS)
		{
			sys_par_flash_save();
		}

		if (par_set.st_set == SET_ST_EDIT)
		{
		}

		if (par_set.st_set == SET_ST_EDIT)
		{
		}
		
		par_set.st_val_changed = 0;
	}

	par_set.st_set = SET_ST_NONE;
}

/*******************************************************************************
* @brief   key confirm.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_key_confirm(void)
{
	pos_shift = 0;

	// 密码输入状态
	if (par_set.st_set == SET_ST_LCK)
	{
		par_tab[par_pos(unlock_code)].uval = par_set.par_val.uval;
		switch (par_set.par_val.uval)
		{
		case 3:
			par_set.st_set = SET_ST_SYS;
			par_jump_init(&par_set, &sys_par.head, par_attr_tab, par_pos(end));
			par_jump_start(&par_set, par_pos(prog_mode));
			break;
		default:
			par_set.st_set = SET_ST_NONE;
			break;
		}
	}
	// 系统参数设定状态
	else if (par_set.st_set == SET_ST_SYS)
	{
		par_val_set(par_set.par_num, par_set.par_val.ival);

		par_jump_next(&par_set);

		if (par_set.par_num == 0)
		{
			if (par_set.st_val_changed)
			{
				sys_par_flash_save();
			}
			par_set.st_set = 0;
		}
	}
	// 编辑状态
	else if (par_set.st_set == SET_ST_EDIT)
	{
	}
	// 空闲状态
	else if (par_set.st_set == SET_ST_NONE)
	{
	}
	else
	{
		par_set.st_set = SET_ST_NONE;
	}
}

/*******************************************************************************
* @brief   key fore par.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_key_prev_par(void)
{
	if (par_set.st_set == SET_ST_SYS)
	{
		par_val_set(par_set.par_num, par_set.par_val.ival);
		par_jump_prev(&par_set);
		gui_st.edit_shift = 0;
	}
}


/*******************************************************************************
* @brief   key shift.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_key_shift(void)
{
	gui_st.edit_shift++;
	if (gui_st.edit_shift > 7)
		gui_st.edit_shift = 0;
}
/*******************************************************************************
* @brief   par value change.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_val_change(int8_t dir, int8_t keep)
{
	int32_t inc;
	int16_t mul;
	char opt_req = 0;

	// 状态检测
	if (par_set.st_set <= SET_ST_SCAN)
		return;

	// 修改数据
	if (0 == keep)
	{
		// 点按
		mul = 1;
		opt_req = 1;
	}
	else
	{
		if (par_key.keep_time_cnt < 10)
			return;

		if (0 == pos_shift)
		{
			// 个位持续操作
			if (tim_pulse.pulse_200ms)
			{
				mul = (par_key.keep_time_cnt - 20) >> 3;
				if (mul > 20)
					mul = 20;

				if (par_key.keep_time_cnt < 20)
					mul = 1;
				else
					mul = 1 + ((mul * mul) >> 1);

				if (mul > 123)
					mul = 123;

				opt_req = 1;
			}
		}
		else
		{
			// 带移位持续操作
			if (tim_pulse.pulse_500ms)
			{
				mul = 1;
				opt_req = 1;
			}
		}
	}
	// 增量操作
	if (opt_req)
	{
		inc = inc_num[pos_shift] * mul * dir;
		par_set.par_val.ival += inc;
		par_set.par_val.ival = par_correct(par_set.par_num, par_set.par_val.ival);
	}
}

/*******************************************************************************
* @brief   key inc.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_key_inc_once(void)
{
	par_user_val_change(1, 0);
}

void par_user_key_inc_keep(void)
{
	par_user_val_change(1, 1);
}

/*******************************************************************************
* @brief   key dec.
* \param[in] none
* \retval none
*******************************************************************************/
void par_user_key_dec_once(void)
{
	par_user_val_change(-1, 0);
}

void par_user_key_dec_keep(void)
{
	par_user_val_change(-1, 1);
}
